home *** CD-ROM | disk | FTP | other *** search
- program LZSFX;
- (* ---------------
- # LZSS self extract by MASSAN
-
- $Log: RCS/lzsfx.pas $
- revision 1.4 MAS 89/02/02 03:46:31
- bug fixed. (calc page size)
-
- # revision 1.3 MAS 88/07/10 21:48:55
- # not directly change code segment.
- #
- # revision 1.2 MAS 88/06/18 22:04:00
- # change to make .EXE file.
- # arg 2 = destin file.
- #
- # revision 1.1 MAS 88/05/22 20:08:48
- # Initial revision
- #
- -----------------*)
- const
- _header: string[80] = '$Header: RCS/lzsfx.pas 1.4 89/02/02 03:46:31 MAS Exp $';
- pathlen = 64 ; { MS-DOS}
- maxstr = 255 ;
- texbufsize = 1024;
- type
- tex = text;
- anystr = string;
- pathtype = string[pathlen];
- {$i open.prc}
- const
- bufsize = 4096;
- var f,ouf: file;
- fname,oufname: pathtype;
- size : integer;
- buf : array[1..bufsize] of byte;
-
- procedure LZStub; external;
- {$L LZSTUB.BOB}
- procedure LZStubJr; external; (* small size version *)
- {$L LZSTUBJR.BOB}
-
-
- procedure WriteHeader;
- const headmin = 32; (* minimum size of header *)
- type exehead= record case Boolean of
- true:(
- id : array[1..2] of char; (* MZ *)
- lastbyte, page, (* module size = (page-1)*512+lastbyte*)
- (* cf. GetExeLen *)
- relnum, (* # of relocation table *)
- headsize, (* size of header *)
- minalloc, maxalloc, (* free area size *)
- ss, sp, (* initial value of stack *)
- checksum, (* ignore it *)
- ip, cs, (* initial value of pc *)
- relofs, overlaynum (* ignore it *)
- : word);
- false:(a: array[0..513] of byte);
- end ;
-
- procedure GetExeLen(var h:exehead; var exestart,exelen:integer);
- begin
- with h do begin
- exestart := headsize shl 4;
- if lastbyte = 0 then exelen := page shl 9 - exestart
- else exelen := (page-1) shl 9 +lastbyte-exestart
- end
- end ;
-
- var exeptr,exenew: ^exehead;
- exestart,exelen: integer;
- modulesize: longint;
- begin
- exeptr := Addr(LZStubJr);
- GetExeLen(exeptr^, exestart,exelen);
- modulesize := FileSize(f) + exelen + 1; (* 1 for end mark *)
- if modulesize >= $ffff then begin
- exeptr := Addr(LZStub);
- GetExeLen(exeptr^, exestart, exelen);
- modulesize := FileSize(f) + exelen + 1
- end;
- GetMem(exenew, exelen+headmin);
- (* ╤└▐┼ reloc.ª ╩╠▐▓├ ║╦▀░ *)
- Move(exeptr^, exenew^, headmin);
- Move(exeptr^.a[exestart], exenew^.a[headmin], exelen);
-
- with exenew^ do begin
- headsize := headmin shr 4 ;
- page := (modulesize + headmin) shr 9 + 1;
- lastbyte := (modulesize + headmin) and 511;
- ss := (modulesize + 15) shr 4
- end;
- BlockWrite(ouf, exenew^, exelen+headmin);
- FreeMem(exenew, exelen+headmin)
- end;
-
-
- begin
- if ParamCount < 1 then begin
- WriteLn('usage: LZSFX source[.LZS] [destin[.EXE]]'); Halt(1)
- end;
- {$i-}
- fname := NewFname(ParamStr(1),'LZS','+');
- Assign(f, fname); Reset(f, 1); if IOresult <> 0 then CantHalt(fname);
-
- if ParamCount > 1 then oufname := NewFname(ParamStr(2),'EXE','-')
- else oufname := NewFname(fname,'EXE','-');
-
- if FileExist(oufname) then begin
- WriteLn('File ', oufname, ' already exists'); Halt(1)
- end;
- Assign(ouf, oufname); Rewrite(ouf, 1); if IOresult <> 0 then CantHalt(fname);
- {$i+}
- Write('Creating SFX file ', oufname);
-
- WriteHeader;
- while not Eof(f) do begin
- BlockRead(f, buf, SizeOf(buf), size);
- BlockWrite(ouf, buf, size)
- end;
- buf[1] := 0; BlockWrite(ouf, buf[1], 1); (* end mark *)
- Close(f); Close(ouf);
- WriteLn
- end.
-